package com.atguigu.advanced.pool;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.junit.Test;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;

public class HiKari {
    /**
     * 硬编码 : 将连接池的配置信息和我们的Java代码耦合在一起
     * 1. 创建HikariDataSource连接池对象
     * 2. 设置连接池的配置信息[必须 | 非必须]
     * 3. 通过连接池获取连接对象
     * 4. 回收连接[不是释放连接, 而是将连接归还给连接池, 给其他线程的请求进行复用]
     *
     * @throws Exception
     */
    @Test
    public void testHardCodeHiKari() throws Exception {
        // 1. 创建DruidDataSource连接池对象
        HikariDataSource hiKariDataSource = new HikariDataSource();

        // 2.1 必要的配置信息
        hiKariDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        hiKariDataSource.setJdbcUrl("jdbc:mysql:///atguigu");
        hiKariDataSource.setUsername("root");
        hiKariDataSource.setPassword("mysqlmima");

        // 2.2 非必要的配置信息
        // 设置最小空闲连接数
        hiKariDataSource.setMinimumIdle(10);
        // 设置最大的连接池数量
        hiKariDataSource.setMaximumPoolSize(20);

        // 3. 通过连接池获取连接对象
        Connection connection = hiKariDataSource.getConnection();
        System.out.println(connection);

        // 4. 回收连接[不是释放连接, 而是将连接归还给连接池, 给其他线程的请求进行复用]
        connection.close();
    }

    /**
     * 软编码 : 将连接池的配置信息放入配置文件, 根据配置文件来创建连接池对象
     * 1. 创建Properties对象
     * 2. 读取配置文件
     * 3. 根据配置文件创建Hikari连接池配置对象
     * 4. 基于Hikari配置对象，构建连接池
     * 5. 获取连接对象
     * 6. 回收连接[不是释放连接, 而是将连接归还给连接池, 给其他线程的请求进行复用]
     *
     * @throws Exception
     */
    @Test
    public void testSoftHiKari() throws Exception {
        // 1. 创建Properties对象
        Properties properties = new Properties();

        // 2. 读取配置文件
        InputStream is = DruidTest.class.getClassLoader().getResourceAsStream("hikari.properties");
        properties.load(is);

        // 3. 创建Hikari连接池配置对象，将Properties集合传进去
        HikariConfig hikariConfig = new HikariConfig(properties);

        // 4. 基于Hikari配置对象，构建连接池
        HikariDataSource hikariDataSource = new HikariDataSource(hikariConfig);

        // 5. 获取连接对象
        Connection connection = hikariDataSource.getConnection();
        System.out.println(connection);

        // 6. 回收连接[不是释放连接, 而是将连接归还给连接池, 给其他线程的请求进行复用]
        connection.close();
        is.close();
    }
}
